# -*- coding: utf-8 -*-
__author__ = 'lztkdr'
__date__ = '2020/3/25 16:49'

"""
特征工程、数据预处理
 在sklearn 中， fit_transform 实现了特征工程的API。
"""
######## 特征抽取（feature_extraction） ##########################################################

#  字典数据 特征抽取
from sklearn.feature_extraction import DictVectorizer
#  对文本 进行 进行特征提取
from sklearn.feature_extraction.text import CountVectorizer
#  对文本 的词频方式 进行特征提取
from sklearn.feature_extraction.text import TfidfVectorizer

# 导入jieba分词
import jieba

###
#   特征工程 : 将原始数据转换为更好地代表预测模型的潜在问题的特征的过程，从而提高了对未知数据的预测准确性，直接影响预测结果。
#   把文本转换为数值,特征值化，让计算机更好的理解数据
####


def dictvec():
	"""
	字典数据 特征抽取，主要针对 特征里包含 字符串 的情况
	列转行，one-hot 编码
	:return:
	"""
	dc = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
	dvr = DictVectorizer()
	data = dvr.fit_transform(dc)  # 处理之后 ，节约内存，方便读取处理
	print('DictVectorizer():\n',data)

	print("----------------------")

	# 二维数组
	dvr = DictVectorizer(sparse=False)  # sparse=False意思是 不产生稀疏矩阵
	data = dvr.fit_transform(dc)  # 把特征转换成数值型数据， 处理之后 ，节约内存，方便读取处理
	print('DictVectorizer(sparse=False):\n',data)  # numpy.ndarray 类型

	print("----------------------")
	names = dvr.get_feature_names()
	print(names)

	print("----------------------")
	print(dvr.inverse_transform(data))

	return None


def countvec():
	"""
	对文本 进行 特征值化，对汉字支持不好
	:return:
	"""
	cv = CountVectorizer()
	# 英文：
	data = cv.fit_transform(["life is short,i like python", "life is too long,i dislike python"])
	print(data)
	print("----------------------")
	print(data.toarray())
	print("----------------------")
	# 单个字母 不会统计，因为 没特别强调的含义
	names = cv.get_feature_names()
	print(names)
	print("----------------------")
	# 中文, 不能够有效的 进行特征化，更了更好的效果，需要分词处理。
	data = cv.fit_transform(["人生苦 短 ，我喜欢python", "人生漫长，不用python"])
	names = cv.get_feature_names()
	print(names)
	return None


def cutword():
	con1 = jieba.cut("今天很残酷，明天更残酷，后天很美好，但绝对大部分是死在明天晚上，所以每个人不要放弃今天。")

	con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的，这样当我们看到宇宙时，我们是在看它的过去。")

	con3 = jieba.cut("如果只用一种方式了解某样事物，你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")

	# 转换成列表
	content1 = list(con1)
	content2 = list(con2)
	content3 = list(con3)

	# 吧列表转换成字符串
	c1 = ' '.join(content1)
	c2 = ' '.join(content2)
	c3 = ' '.join(content3)
	return c1, c2, c3


def hanzicv():
	"""
	中文特征值化
	:return:
	"""
	c1, c2, c3 = cutword()

	print(c1, c2, c3)
	print("----------------------")
	cv = CountVectorizer()

	data = cv.fit_transform([c1, c2, c3])

	print(cv.get_feature_names())
	print("----------------------")
	print(data.toarray())

	return None


def tfidfvec():
	"""
	Tf:term frequency 词的频率 出现的次数
	idf:逆文档频率 inverse document frequency
	TF-IDF 主要思想：如果某个词或短语在一篇文章中出现的概率高，并且在其他文章中很少出现，
	则认为此词或者短语具有很好的类别区分能力，适合用来分类。
	TF-IDF 作用：用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
	应用场景：情感分析
	:return:
	"""
	c1, c2, c3 = cutword()

	print(c1, c2, c3)

	tf = TfidfVectorizer(stop_words=["一种", "不会"])  # stop_words 用来排除 字词短语

	data = tf.fit_transform([c1, c2, c3])

	print(tf.get_feature_names())

	print(data.toarray())
	return None


if __name__ == "__main__":
	"""
	one-hot编码:
		CountVectorizer、TfidfVectorizer	
	"""
	print("====================dictvec==========================")
	dictvec()
	print("=====================countvec=========================")
	countvec()
	print("======================hanzicv========================")
	hanzicv()
	print("=====================tfidfvec=========================")
	tfidfvec()
